home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / mint / netlib / lib / gpeernam.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-27  |  1.4 KB  |  75 lines

  1. /*
  2.  *    getpeername() emulation for MiNT-Net, (w) '93, kay roemer
  3.  */
  4.  
  5. #include "socklib.h"
  6. #ifdef KERNEL
  7. #undef UNX2DOS
  8. #include "kerbind.h"
  9. #else
  10. #include <mintbind.h>
  11. #endif
  12. #include "sys/socket.h"
  13. #include "mintsock.h"
  14.  
  15. #ifdef UNX2DOS
  16. #include "sys/un.h"
  17. #define UN_OFFSET    ((short)((struct sockaddr_un *)0)->sun_path)
  18. #endif
  19.  
  20. #ifndef KERNEL
  21. extern int errno;
  22. #endif
  23.  
  24. int
  25. getpeername (fd, addr, addrlen)
  26.     int fd;
  27.     struct sockaddr *addr;
  28.     _SIZE_T *addrlen;
  29. {
  30.     struct getpeername_cmd cmd;
  31.     short addrlen16;
  32.     int r;
  33. #ifdef UNX2DOS
  34.     _SIZE_T oaddrlen = addrlen ? *addrlen : 0;
  35. #endif
  36.  
  37.     if (addrlen) addrlen16 = (short)*addrlen;
  38.     
  39.     cmd.cmd =    GETPEERNAME_CMD;
  40.     cmd.addr =    addr;
  41.     cmd.addrlen =    &addrlen16;
  42.  
  43. #ifdef KERNEL
  44.     r = f_cntl (fd, (long)&cmd, SOCKETCALL);
  45. #else
  46.     r = Fcntl (fd, (long)&cmd, SOCKETCALL);
  47. #endif
  48.     if (addrlen) *addrlen = addrlen16;
  49.     
  50. #ifdef UNX2DOS
  51.     if (addr && addrlen && addr->sa_family == AF_UNIX && r >= 0) {
  52.         struct sockaddr_un *unp = (struct sockaddr_un *)addr;
  53.         char name[sizeof (unp->sun_path)];
  54.         extern int _dos2unx (const char *, char *);
  55.         extern int _sncpy (char *, const char *, _SIZE_T);
  56.         
  57.         if (addrlen16 > UN_OFFSET) {
  58.             _dos2unx (unp->sun_path, name);
  59.             *addrlen = UN_OFFSET + _sncpy (unp->sun_path, name,
  60.                 oaddrlen - UN_OFFSET);
  61.         }
  62.     }
  63. #endif
  64.  
  65. #ifdef KERNEL
  66.     return r;
  67. #else
  68.     if (r < 0) {
  69.         errno = -r;
  70.         return -1;
  71.     }
  72.     return 0;
  73. #endif
  74. }
  75.